package com.spider.im.chat.message;

import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.Message;
import com.google.protobuf.Parser;
import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ConcurrentHashMap;

@Slf4j
public abstract class AbstractMessageStrategy<T extends Message> implements MessageStrategy<T>{

    /**
     * 存储活跃通道的线程安全集合。
     * 键为 Channel 的唯一标识符（Long 类型），值为对应的 Channel 对象。
     * 注意：需确保在多线程环境下对复合操作进行同步。
     */
   public static final ConcurrentHashMap<Long, Channel> activeChannels = new ConcurrentHashMap<>();

    @Override
    public void handle(ChannelHandlerContext ctx, ByteString payload) {

        try {
            Parser<T> parser = getParser();
            T msg  = parser.parseFrom(payload);
            handle(ctx, msg);
        } catch (InvalidProtocolBufferException e) {
           log.error("解析消息失败",e);
        }
    }

    public abstract Parser<T> getParser() ;

    /**
     * 处理消息
     * @param ctx
     * @param message 解析后的消息
     */
    public abstract void handle(ChannelHandlerContext ctx, T message) ;

    /**
     * 给客户端响应消息
     */
    public void sendResponse(Channel channel, Message wrapper) {
        // 将 protobuf 消息序列化为 ByteString
        ByteString byteString = wrapper.toByteString();
        // 将 ByteString 转换为 ByteBuf
        ByteBuf bufferResp = channel.alloc().buffer(byteString.size());
        bufferResp.writeBytes(byteString.asReadOnlyByteBuffer());
        // 发送消息
        channel.writeAndFlush(new BinaryWebSocketFrame(bufferResp));
    }
}
